builderparser: Save finalizers in a GPtrArray
authorTimm Bäder <mail@baedert.org>
Sat, 9 Jan 2021 14:58:56 +0000 (15:58 +0100)
committerTimm Bäder <mail@baedert.org>
Sun, 17 Jan 2021 03:39:26 +0000 (04:39 +0100)
We get up to 370 of these when starting the widget-factory.

gtk/gtkbuilderparser.c
gtk/gtkbuilderprivate.h

index 5008b4b7dde29aa8eaba3ed80acee6c94b9e1e27..b368d82cc5503da6922d45dd5f6a22502e3268a8 100644 (file)
@@ -1955,7 +1955,7 @@ end_element (GtkBuildableParseContext  *context,
 
       if (GTK_IS_BUILDABLE (object_info->object) &&
           GTK_BUILDABLE_GET_IFACE (object_info->object)->parser_finished)
-        data->finalizers = g_slist_prepend (data->finalizers, object_info->object);
+        g_ptr_array_add (data->finalizers, object_info->object);
 
       if (object_info->signals)
         {
@@ -2175,6 +2175,7 @@ _gtk_builder_parser_parse_buffer (GtkBuilder   *builder,
   data.object_ids = g_hash_table_new_full (g_str_hash, g_str_equal,
                                            (GDestroyNotify)g_free, NULL);
   data.stack = g_ptr_array_new ();
+  data.finalizers = g_ptr_array_new ();
 
   if (requested_objs)
     {
@@ -2214,10 +2215,9 @@ _gtk_builder_parser_parse_buffer (GtkBuilder   *builder,
     }
 
   /* Common parser_finished, for all created objects */
-  data.finalizers = g_slist_reverse (data.finalizers);
-  for (l = data.finalizers; l; l = l->next)
+  for (guint i = 0; i < data.finalizers->len; i++)
     {
-      GtkBuildable *buildable = (GtkBuildable*)l->data;
+      GtkBuildable *buildable = g_ptr_array_index (data.finalizers, i);
 
       gtk_buildable_parser_finished (GTK_BUILDABLE (buildable), builder);
       if (_gtk_builder_lookup_failed (builder, error))
@@ -2227,10 +2227,10 @@ _gtk_builder_parser_parse_buffer (GtkBuilder   *builder,
  out:
 
   g_slist_free_full (data.custom_finalizers, (GDestroyNotify)free_subparser);
-  g_slist_free (data.finalizers);
   g_free (data.domain);
   g_hash_table_destroy (data.object_ids);
   g_ptr_array_free (data.stack, TRUE);
+  g_ptr_array_free (data.finalizers, TRUE);
   gtk_buildable_parse_context_free (&data.ctx);
 
   /* restore the original domain */
index 3b5568fa972a9c021b5a3bc2fa85b7ad0188c1d8..34a48dd45498d260963032e123d277b381b310b1 100644 (file)
@@ -179,7 +179,7 @@ typedef struct {
   SubParser *subparser;
   GtkBuildableParseContext ctx;
   const char *filename;
-  GSList *finalizers;
+  GPtrArray *finalizers;
   GSList *custom_finalizers;
 
   const char **requested_objects; /* NULL if all the objects are requested */